﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace Financial_Assistant
{
    /// <summary>
    /// Логика взаимодействия для AdminWindow.xaml
    /// </summary>
    public partial class AdminWindow : Window
    {
        public ObservableCollection<Log> UserNames { get; private set; } // коллекция для привязки данных к дата_гриду

        private string _connectionString =
                @"Data Source = CHRISTINABEIM\SQLEXPRESS; Initial Catalog=Financial_Assistant; Trusted_Connection=True;"; //( ip-сервера, имя БД, разрешение соединения)

        public AdminWindow()
        {
            InitializeComponent();
            UserNames = new ObservableCollection<Log>();
            UsersGrid.CanUserAddRows = false;
            UsersGrid.CanUserDeleteRows = false;
            UsersGrid.IsReadOnly = true;
            UsersGrid.ItemsSource = UserNames; // задаем источник данных для грида
            GridUpdate(); // обновляем грид
        }

        private void Exit_but_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void Add_but_Click(object sender, RoutedEventArgs e)
        {
            AddingUsersWindow userCard = new AddingUsersWindow();
            userCard.ShowDialog();
            GridUpdate(); // обновляем грид
        }

        private string GetUserID(string userName)
        {
            try
            {
                SqlConnection connection = new SqlConnection(_connectionString);

                StringBuilder query = new StringBuilder();
                query.Append("SELECT [ID пользователя] FROM [Имена Входа] where Имя = '");
                query.Append(userName + "'");

                SqlCommand command = new SqlCommand(query.ToString(), connection);
                connection.Open(); // открыть считывание
                SqlDataReader reader = command.ExecuteReader();

                string results = String.Empty;

                while (reader.Read())
                {
                    for (int j = 0; j < reader.FieldCount; j++)
                    {
                        results += reader[j].ToString();
                    }
                }
                return results;
            }
            catch (Exception ex)
            {
                MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message);
                return String.Empty;
            }
        }

        private void Change_but_Click(object sender, RoutedEventArgs e)
        {
            if (this.UsersGrid.SelectedItem != null)
            {
                try
                {
                    //получаем [ID пользователя]
                    string user_ID = GetUserID(UserNames[UsersGrid.SelectedIndex].UserName);

                    //проверяем задан ли пароль
                    SqlConnection connection = new SqlConnection(_connectionString);
                    StringBuilder query = new StringBuilder();

                    query.Append("SELECT Пароль FROM [Имена Входа] where [ID пользователя] = '");
                    query.Append(user_ID + "'");

                    connection.Open(); // открыть считывание
                    SqlCommand command = new SqlCommand(query.ToString(), connection);
                    SqlDataReader reader = command.ExecuteReader();

                    string results = String.Empty;
                    while (reader.Read())
                    {
                        for (int j = 0; j < reader.FieldCount; j++)
                        {
                            results += reader[j].ToString();
                        }
                    }
                    connection.Close();
                    reader.Dispose();
                    command.Dispose();

                    if (results == String.Empty)
                    {
                        ChangingUsersWindow userCard = new ChangingUsersWindow(UserNames[UsersGrid.SelectedIndex].UserName, user_ID);
                        userCard.ShowDialog();
                        GridUpdate(); // обновляем грид
                    }
                    else
                    {
                        Confirmation userConfirmation = new Confirmation(ActionType.Change, user_ID, results, UserNames[UsersGrid.SelectedIndex].UserName);
                        userConfirmation.ShowDialog();
                        GridUpdate(); // обновляем грид
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Выберите данные для изменения");
            }
        }

        private void Delete_But_Click(object sender, RoutedEventArgs e)
        {
            //НАСТРОЕНО КАСКАДНОЕ УДАЛЕНИЕ!!!!
            //Находим выбранного пользователя и запрашиваем подтверждение пароля
            if (this.UsersGrid.SelectedItem != null)
            {
                try
                {
                    //получаем [ID пользователя]
                    string user_ID = GetUserID(UserNames[UsersGrid.SelectedIndex].UserName);

                    //проверяем задан ли пароль
                    SqlConnection connection = new SqlConnection(_connectionString);
                    StringBuilder query = new StringBuilder();

                    query.Append("SELECT Пароль FROM [Имена Входа] where [ID пользователя] = '");
                    query.Append(user_ID + "'");

                    connection.Open(); // открыть считывание
                    SqlCommand command = new SqlCommand(query.ToString(), connection);
                    SqlDataReader reader = command.ExecuteReader();

                    string results = String.Empty;
                    while (reader.Read())
                    {
                        for (int j = 0; j < reader.FieldCount; j++)
                        {
                            results += reader[j].ToString();
                        }
                    }
                    connection.Close();
                    reader.Dispose();
                    command.Dispose();

                    if (results != String.Empty)
                    {
                        Confirmation userConfirmation = new Confirmation(ActionType.Delete, user_ID, results, UserNames[UsersGrid.SelectedIndex].UserName);
                        userConfirmation.ShowDialog();
                        GridUpdate(); // обновляем грид
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + ex.Message);
                }
            }
            else
            {
                MessageBox.Show("Выберите данные для изменения");
            }
        }

        private void GridUpdate()
        {
            UserNames.Clear();
            try
            {
                SqlConnection connection = new SqlConnection(_connectionString);
                List<string> assigmentList = new List<string>();

                String query = "SELECT Имя FROM [Имена входа]";
                SqlCommand command = new SqlCommand(query, connection);
                connection.Open(); // открыть считывание

                SqlDataReader reader = command.ExecuteReader();
                string results = String.Empty;

                while (reader.Read())
                {
                    Log data = new Log();
                    for (int j = 0; j < reader.FieldCount; j++)
                    {
                        data.UserName = reader[j].ToString();
                    }
                    UserNames.Add(data);
                }
                reader.Close();
                command.Dispose();
                connection.Dispose();
            }
            catch (Exception em)
            {
                MessageBox.Show(this, "Ошибка чтения из базы данных" + Environment.NewLine + em.Message);
            }
        }
    }

    public partial class Log
    {
        public string UserName { get; set; }

        public Log()
        {
            UserName = String.Empty;
        }
    }
}
